# -*- coding: utf-8 -*-
'''
@author: Artur Ataíde 11508, Pedro Fernandes 9634
@date: Novembro de 2012
Módulo para ir buscar os campos desejados à base de dados
e gravar num ficheiro CSV
'''
import sqlalchemy
from sqlalchemy import *
import csv
from collections import Counter

'''
abertura da base de dados para fazer as query's
'''
inicio_ano = 5
fim_ano = 21
lista = []	
lista_enviar = []	
  
def primeira_pesquisa():
	'''
	método que faz a pesquisa dos cursos que contêm a
	palavra informática ou computadores. Depois coloca os dados
	referentes a esses cursos bem como os anos em que tiveram 
	alunos inscritos
	'''
	#conecta-se á base de dados
	database = create_engine('sqlite:///Matriculas.db')
	metadata = MetaData(database)
	insc = Table('inscritos', metadata, autoload = True)
	lista = []		
	nome = "pesquisa1.csv"# nome do csv a criar
	#Cria ficheiro csv
	c = csv.writer(open(nome, "wb"))				
	result = insc.select(or_(insc.c.curso.like(u'%informática%'), insc.c.curso.like(u'%computadores%')))
	rs = result.execute()		
	for row in rs:
		#preenche a lista de valores a inserir na linha do csv
		lista.append(row[1].encode('utf-8'))
		lista.append(row[2].encode('utf-8'))
		lista.append(row[4].encode('utf-8'))
		for i in range(inicio_ano, fim_ano):
			if not row[i] == '-':
				lista.append(get_ano(row[i], i))
		#escreve uma linha no csv
		c.writerow(lista)	
		#limpa a lista
		lista = []
	
def segunda_pesquisa():
	'''
	método que faz a pesquisa dos cursos que contêm a
	palavra informática ou computadores, colocando os dados
	referentes a esses cursos bem como o número de alunos
	inscritos
	'''
	#conecta-se á base de dados
	database = create_engine('sqlite:///Matriculas.db')
	metadata = MetaData(database)
	insc = Table('inscritos', metadata, autoload = True)
	lista = []	
	nome = "pesquisa2.csv" # nome do csv a criar
	c = csv.writer(open(nome, "wb"))				
	result = insc.select(or_(insc.c.curso.like(u'%informática%'), insc.c.curso.like(u'%computadores%')))
	rs = result.execute()	
	for row in rs:		
		#preenche a lista de valores a inserir na linha do csv
		lista.append(row[4].encode('utf-8'))
		for i in range(inicio_ano, fim_ano):
			if row[i] == '-':
				lista.append(0)
			else:
				lista.append(row[i].encode('utf-8'))
		#escreve uma linha no csv
		c.writerow(lista)	
		#limpa a lista
		lista = []

def ultima_pesquisa(nome):
	'''
	método que efectua a pesquisa dos níveis de formação,
	colocando (sem repetições) no ficheiro csv bem como
	o número de cursos respectivos ou numero de alunos inscritos
	em cada ano, dependendo do parametro que receber

	@param nome - nome do ficheiro que irá ser criado
	'''		
	#conecta-se á base de dados
	database = create_engine('sqlite:///Matriculas.db')
	metadata = MetaData(database)
	insc = Table('inscritos', metadata, autoload = True)
	lista = []	
	lista_enviar = []	
	c = csv.writer(open(nome, "wb"))			
	result = insc.select()
	rs = result.execute()
	#gravar os niveis de formação sem repetições na lista
	for row in rs:
		lista.append(row[3].encode('utf-8'))		
	counter  = Counter(lista)
	lista = list(set(lista))
	#ver os cursos ou alunos incritos por ano nesse nível de formação 	
	for i in range(len(lista)):			
		#preenche a lista de valores a inserir na linha do csv
		result = insc.select((insc.c.niv_form == lista[i].decode('utf-8')))
		rs = result.execute()
		lista_enviar.append(lista[i]) 		
		for k in range(inicio_ano, fim_ano):
			rs = result.execute()
			if nome == 'pesquisa3.csv':			
				lista_enviar.append(numero_cursos(rs, k))
			if nome == 'pesquisa4.csv':
				lista_enviar.append(get_alunos(rs, k))	
		#escreve uma linha no csv
		c.writerow(lista_enviar)	
		#limpa a lista
		lista_enviar = []

def numero_cursos(rs, k):
	'''
	devolve o numero de cursos por nivel de formação abertos naquele ano

	@param rs - resultado da query a base de dados
	@param k - indice que indica o ano em que estamos a fazer a pesquisa
	@return - o numero de cursos por ano
	'''
	cursos = 0
	for row in rs:
		if row[k] != '-':				
			cursos = cursos + 1 
	return cursos

def get_alunos(rs, k):
	'''
	método que devolve o número de alunos por nível de formação naquele ano

	@param rs - resultado da query a base de dados
	@param k - indice que indica o ano em que estamos a fazer a pesquisa
	@return - o numero de alunos naquele ano
	'''
	alunos = 0	
	for row in rs:					
		if row[k] != '-':			
			alunos = alunos + float(row[k].encode('utf-8'))
		else:
			alunos = alunos + 0
	return alunos	

def get_ano(valor, ano):
	'''
	método que recebe um indice e envia o ano respectivo a esse indice

	@param valor - valor guardado nesse indice
	@param ano - indice do ano desejados
	@return - string com o ano desejado
	'''
	menos_pos = 5
	anos = ['95-96', '96-97', '97-98', '98-99', '99-00',
			'00-01', '01-02', '02-03', '03-04', '04-05',
			'05-06', '06-07', '07-08', '08-09', '09-10', '10-11']
	if not valor == '-':
		return anos[int(ano) - menos_pos]
